package cn.anecansaitin.firecrafting.api.client.crafting;

import cn.anecansaitin.firecrafting.api.common.crafting.IFireRecipe;
import cn.anecansaitin.firecrafting.client.crafting.FireEnergyRecipeRender;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import oshi.util.tuples.Quartet;
import oshi.util.tuples.Triplet;

import java.util.ArrayList;
import java.util.List;

/**
 * 处理配方如何在JEI的配方查询中展示,主要用于产物的渲染
 * @see FireEnergyRecipeRender
 */
public interface IJEIRecipeRender {
    /**
     * 在火焰绘制之前渲染
     */
    default void drawBeforeFire(IFireRecipe recipe, PoseStack stack, double mouseX, double mouseY) {

    }

    /**
     * 在火焰绘制之后渲染
     */
    default void drawAfterFire(IFireRecipe recipe, PoseStack stack, double mouseX, double mouseY) {

    }

    /**
     * 添加高亮，类似于鼠标指向背包内物品时的高亮提示。<br/>
     * 只返回当前可见的坐标。<br/>
     * Quartet的参数如下：<br/>
     * Integer  Integer  Integer  Integer<br/>
     * x起点     y起点    宽度      高度
     */
    default List<Quartet<Integer, Integer, Integer, Integer>> getHighlight(IFireRecipe recipe, double mouseX, double mouseY) {
        return new ArrayList<>();
    }

    /**
     * 添加Tooltip，似于鼠标指向背包内物品时的提示文本。<br/>
     * 只返回当前可见的文本。
     */
    default List<Component> getTooltip(IFireRecipe recipe, double mouseX, double mouseY) {
        return new ArrayList<>();
    }

    /**
     * 添加物品产物渲染，不包含格子背景渲染。<br/>
     * Triplet参数如下：<br/>
     * ItemStack  Integer  Integer<br/>
     * 被渲染物品   x坐标     y坐标
     */
    default List<Triplet<ItemStack, Integer, Integer>> getResultItemSlots(IFireRecipe recipe) {
        return new ArrayList<>();
    }

    /**
     * 添加物品原料渲染，不包含格子背景渲染。<br/>
     * Triplet参数如下：<br/>
     * Object     Integer  Integer<br/>
     * 被渲染物品   x坐标     y坐标<br/>
     * Object支持的类型：<br/>
     * ItemStack  Ingredient  List{@literal <}ItemStack{@literal >}
     */
    default List<Triplet<Object, Integer, Integer>> getInputItemSlots(IFireRecipe recipe) {
        return new ArrayList<>();
    }

    /**
     * 添加流体产物渲染，不包含格子背景渲染。<br/>
     * Triplet参数如下：<br/>
     * FluidStack  Integer  Integer<br/>
     * 被渲染流体    x坐标     y坐标<br/>
     */
    default List<Triplet<FluidStack, Integer, Integer>> getResultFluidSlots(IFireRecipe recipe) {
        return new ArrayList<>();
    }
}
